package main

import "fmt"

func main() {
	/*
		1.for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环
		2. range类似迭代器操作，返回 (索引, 值) 或 (键, 值)
	*/

	//test0()
	//test1()
	//test2()
	test3()
}
func test0() {
	s := "abc"
	// 忽略 2nd value，支持 string/array/slice/map。
	for i := range s {
		println(s[i])
	}
	// 忽略 index。
	for _, c := range s {
		println(c)
	}
	// 忽略全部返回值，仅迭代。
	for range s {

	}

	m := map[string]int{"a": 1, "b": 2}
	// 返回 (key, value)。
	for k, v := range m {
		println(k, v)
	}

}

// range 会复制数组中的数据
func test1() {
	a := [3]int{0, 1, 2}

	for i, v := range a { // index、value 都是从复制品中取出。

		if i == 0 { // 在修改前，我们先修改原数组。
			a[1], a[2] = 999, 999
			fmt.Println(a) // 确认修改有效，输出 [0, 999, 999]。
		}

		a[i] = v + 100 // 使用复制品中取出的 value 修改原数组。

	}

	fmt.Println(a) // 输出 [100, 101, 102]。

}

// 使用切片可以修改底层的数据
func test2() {
	s := []int{1, 2, 3, 4, 5}

	for i, v := range s { // 复制 struct slice { pointer, len, cap }。

		if i == 0 {
			s = s[:3]  // 对 slice 的修改，不会影响 range。
			s[2] = 100 // 对底层数据的修改。
		}

		println(i, v)

		/*
			输出的结果
			  0 1
			  1 2
			  2 100
			  3 4
			  4 5
		*/
	}
}

func test3() {

	var arr = [...]int{1, 2, 3, 4, 5}
	var s []interface{}

	var m = make(map[int]int)
	for i, v := range arr {
		fmt.Printf("%p\n", &arr)
		m[i] = v
		s = append(s, &v)

	}

	fmt.Println(m)
	fmt.Println(s)
	for _, v := range s {
		if j, ok := v.(*int); ok {
			fmt.Println(*j)
		}
	}

}
